package cn.tedu.truetaste.service.impl;

import cn.tedu.truetaste.ex.ServiceException;
import cn.tedu.truetaste.mapper.DishesMapper;
import cn.tedu.truetaste.mapper.PictureMapper;
import cn.tedu.truetaste.pojo.dto.PictureAddNewDTO;
import cn.tedu.truetaste.pojo.dto.PictureUpdateDTO;
import cn.tedu.truetaste.pojo.entity.Picture;
import cn.tedu.truetaste.pojo.vo.DishesStandardVO;
import cn.tedu.truetaste.pojo.vo.PictureListItemVO;
import cn.tedu.truetaste.pojo.vo.PictureStandardVO;
import cn.tedu.truetaste.service.IPictureService;
import cn.tedu.truetaste.util.IdUtils;
import cn.tedu.truetaste.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理图片业务的实现类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Service
public class PictureServiceImpl implements IPictureService {

    @Autowired
    private PictureMapper pictureMapper;
    @Autowired
    private DishesMapper dishesMapper;

    public PictureServiceImpl() {
        log.info("创建业务对象：PictureServiceImpl");
    }

    @Override
    public void addNew(PictureAddNewDTO pictureAddNewDTO) {

        log.debug("开始处理【添加轮播图】的业务，参数：{}", pictureAddNewDTO);
        // 调用DishesMapper对象的int countByName(String name)方法统计此名称的菜品的数量
        Long dishesId = pictureAddNewDTO.getDishesId();
        DishesStandardVO dishes = dishesMapper.getStandardById(dishesId);
        // 判断图片所属菜品是否存在
        if (dishes == null) {
            // 是：菜品名称已经存在，抛出RuntimeException异常
            String message = "添加轮播图失败！菜品不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 准备需要添加到数据库的对象
        Picture picture = new Picture();
        BeanUtils.copyProperties(pictureAddNewDTO, picture);

        // 执行插入数据
        int rows = pictureMapper.insert(picture);
        if (rows != 1) {
            String message = "添加轮播图失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除轮播图】的业务，参数：{}", id);
        // 检查尝试删除的轮播图是否存在
        Object queryResult = pictureMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除轮播图失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        int rows = pictureMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除轮播图失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        log.debug("删除完成！");
    }

    @Override
    public void updateInfoById(Long id, PictureUpdateDTO pictureUpdateDTO) {
        log.debug("开始处理【修改轮播图详情】的业务，参数ID：{}，新数据：{}",id, pictureUpdateDTO);

        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            PictureStandardVO picture = pictureMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (picture == null) {
                String message = "修改轮播图详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        {
            // 调用Mapper的countByUrlAndNotId()执行查询，检查新的轮播图是否已经被别的数据占用
            int count = pictureMapper.countByUrlAndNotId(id, pictureUpdateDTO.getUrl());
            // 是：轮播图被别的数据占用，抛出异常（NOT_CONFLICT）
            if (count > 0) {
                String message = "修改轮播图详情失败，新的轮播图图片已经被占用！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建Picture对象
        Picture picture = new Picture();
        // 将参数对象的属性值复制到以上新创建的Picture对象中
        BeanUtils.copyProperties(pictureUpdateDTO, picture);
        picture.setId(id);
        picture.setDishesId(IdUtils.generateId());
        picture.setIsCover(1);
        // 调用Mapper的update(Picture picture)方法执行修改
        log.debug("即将执行修改数据，参数：{}", picture);
        int rows = pictureMapper.update(picture);
        if (rows != 1) {
            String message = "修改轮播图详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public PictureStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询轮播图详情】的业务，参数：{}", id);

        // 调用Mapper的getStandardById()执行查询
        PictureStandardVO picture = pictureMapper.getStandardById(id);
        // 判断查询结果是否为null
        // 是：没有匹配的数据，抛出异常（NOT_FOUND）
        if (picture == null) {
            String message = "查询轮播图详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将返回查询结果：{}", picture);
        return picture;
    }

    @Override
    public List<PictureListItemVO> list() {
        log.debug("开始处理【查询轮播图列表】的业务，无参数");
        List<PictureListItemVO> list = pictureMapper.list();
        log.debug("即将返回查询结果：{}", list);
        return list;
    }

}
